package com.im;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.text.InputFilter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.lang.reflect.Field;

// 登录对话框
public class LogonDialog extends AlertDialog.Builder implements DialogInterface.OnClickListener {
    public interface Callback {
        void onLogonDialogOK(String username, String password);
    }

    private final Callback mCallback;       // 回调
    private final EditText mEditPassword;   // "密码"编辑框
    private final EditText mEditUserName;   // "用户名"编辑框

    /**
     * 构造方法。
     * @param callback  回调
     * @param parent    父活动
     */
    public LogonDialog(Callback callback, Activity parent) {
        super(parent);
        mCallback = callback;

        // 设置自身不会被系统返回键取消
        super.setCancelable(false);

        // 设置标题
        super.setTitle(R.string.IDS_LOGON);

        // 设置视图
        final LayoutInflater layoutInflater = parent.getLayoutInflater();
        final View view = layoutInflater.inflate(R.layout.dialog_logon, null);
        super.setView(view);

        // 设置最大用户名长度和最大密码长度
        mEditUserName = view.findViewById(R.id.IDC_EDIT_USERNAME);
        mEditPassword = view.findViewById(R.id.IDC_EDIT_PASSWORD);
        mEditUserName.setFilters(new InputFilter[]{new InputFilter.LengthFilter(Const.MAX_USERNAME_LEN)});
        mEditPassword.setFilters(new InputFilter[]{new InputFilter.LengthFilter(Const.MAX_PASSWORD_LEN)});

        // 创建按钮
        super.setNegativeButton(android.R.string.cancel, this);
        super.setPositiveButton(android.R.string.ok, this);
    }

    /**
     * 所有按钮的单击响应方法（实现 android.content.DialogInterface.OnClickListener 的接口方法）。
     * @param dialog        对话框
     * @param clickedButton 用户单击的按钮
     */
    @Override
    public void onClick(DialogInterface dialog, int clickedButton) {
        // 使窗口在单击按钮后不自动消失
        try {
            final Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, false);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 处理单击按钮事件
        switch (clickedButton) {
            case DialogInterface.BUTTON_NEGATIVE:
                this.onCancel(dialog);
                break;
            case DialogInterface.BUTTON_POSITIVE:
                this.onOK(dialog);
                break;
        }
    }

    /**
     * "取消"按钮的单击响应方法。
     * @param dialog    对话框
     */
    private void onCancel(DialogInterface dialog) {
        try {
            final Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        dialog.cancel();
    }

    /**
     * "确定"按钮的单击响应方法。
     * @param dialog    对话框
     */
    private void onOK(DialogInterface dialog) {
        final String username = mEditUserName.getText().toString();
        final String password = mEditPassword.getText().toString();

        // 检查用户名是否为空
        if (TextUtils.isEmpty(username)) {
            Toast.makeText(super.getContext(), R.string.IDS_USERNAME_EMPTY, Toast.LENGTH_LONG).show();
            mEditUserName.requestFocus();
            return;
        }

        // 检查密码是否为空
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(super.getContext(), R.string.IDS_PASSWORD_EMPTY, Toast.LENGTH_LONG).show();
            mEditPassword.requestFocus();
            return;
        }

        // 调用回调
        mCallback.onLogonDialogOK(username, password);

        // 关闭窗口
        this.onCancel(dialog);
    }
}
